from pydantic import BaseModel, validator
from typing import Generic, TypeVar, Optional
import re

class UserRegister(BaseModel):
    username: str
    password: str

    @validator('username')
    def username_validate(cls, v):
        # 检查长度
        if not 4 <= len(v) <= 20:
            raise ValueError('用户名长度必须在4-20位之间')
        # 检查字符
        if not re.match(r'^[a-zA-Z0-9_]+$', v):
            raise ValueError('用户名只能包含英文字母、数字和下划线')
        return v

    @validator('password')
    def password_validate(cls, v):
        # 检查密码长度
        if not 6 <= len(v) <= 20:
            raise ValueError('密码长度必须在6-20位之间')
        
        # 检查密码复杂度
        if not re.match(r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{6,20}$', v):
            raise ValueError('密码必须包含字母、数字和特殊字符')
        return v

DataT = TypeVar('DataT')

class BaseResponse(BaseModel):
    # 基础返回
    # 状态码
    status: str
    # 消息
    message: Optional[str] = None

class SuccessResponse(BaseResponse, Generic[DataT]):
    # 成功返回
    status: str = "success"
    data: DataT

class ErrorResponse(BaseResponse):
    # 错误返回
    status: str = "error"
    message: str

class FileResponse(BaseResponse):
    # 文件返回
    status: str = "success"
    file_name: str
    file_data: bytes
    
